#ifndef DISTANCEMEASUREMENTALGORITHM_H
#define DISTANCEMEASUREMENTALGORITHM_H

#include "DistanceMeasurementResultWidget.h"
#include "DistanceMeasurementDrawerFactory.h"
#include "MeasurementAlgorithmBase.h"
#include <QPointF>
#include <QFlags>

/**
 * @brief 距离测量算法类
 * 实现两点间像素距离测量功能，支持单位转换（像素→实际长度）
 */
class DistanceMeasurementAlgorithm : public MeasurementAlgorithmBase {
    Q_OBJECT
    Q_INTERFACES(MeasurementAlgorithmBase)
    Q_PLUGIN_METADATA(IID MEASUREMENTALGORITHMBASE_IID)
public:
    explicit DistanceMeasurementAlgorithm(QObject *parent = nullptr);
    ~DistanceMeasurementAlgorithm() override;

    /**
     * @brief 开始测量
     * 初始化测量环境，准备进行测量操作
     * @param imageId 图像唯一标识符
     */
    void startMeasurement(const QString &imageId) override;
    
    /**
     * @brief 结束测量
     * 清理测量资源，结束当前测量任务
     */
    void endMeasurement() override;
    
    /**
     * @brief 设置测量参数
     * @param params 测量参数集合
     */
    void setMeasurementParameters(const QVariantMap &params) override;

    /**
     * @brief 获取当前处理的图像ID
     * @return 图像ID
     */
    QString currentImageId() const override;

    /**
     * @brief 获取算法名称
     */
    QString algorithmName() const override;

    /**
     * @brief 初始化算法
     */
    void initialize() override;

    /**
     * @brief 获取测量参数
     * @return 包含测量参数的QVariantMap
     */
    QVariantMap getMeasurementParameters() const override;
    
    /**
     * @brief 获取算法支持的测量模式
     */
    MeasurementModes getSupportedModes() const override;

    /**
     * @brief 设置测量结果（用于撤销/重做操作）
     * @param measurementResult 测量结果，包含距离数据
     *
     * 该方法直接设置测量结果而不重新计算，用于撤销/重做操作时恢复之前的测量状态。
     * 它会更新内部状态、注册结果显示界面并发送测量结果信号。
     */
    void setMeasurementResult(const QVariantMap &measurementResult) override;
    
    /**
     * @brief 设置缩放比例
     * @param scale 缩放比例值
     */
    void setScale(double scale) override;
    
    /**
     * @brief 设置单位转换信息
     * @param xUnit X轴单位
     * @param yUnit Y轴单位
     * @param lengthRatio 长度转换比例
     * @param timeRatio 时间转换比例
     * @param wavelengthRatio 波长转换比例
     * @param lengthUnit 长度单位
     * @param timeUnit 时间单位
     * @param wavelengthUnit 波长单位
     */
    void setUnitConversionInfo(int xUnit, int yUnit, double lengthRatio,
                              double timeRatio, double wavelengthRatio, const QString &lengthUnit,
                              const QString &timeUnit, const QString &wavelengthUnit) override;
    
private slots:
    /**
     * @brief 处理线位置变化信号
     * 当测量线位置变化时更新测量结果
     */
    void onLinePositionChanged(const QVariantMap &result);
    
private:
    /**
     * @brief 绘制测量图形
     * 根据参数在图像上绘制测量工具
     * @param params 包含绘制参数的QVariantMap
     */
    void drawMeasurementGraphics(const QVariantMap &params);
    
private:
    DistanceMeasurementResultWidget *m_resultWidget; // 结果显示界面
    DistanceMeasurementDrawerFactory *m_drawerFactory; // 绘制器工厂
    QVariantMap m_Result;//存储结果
};

#endif // DISTANCEMEASUREMENTALGORITHM_H
